<?php

/**
 * Trida zpristupnuje dostupne jazyky jednotlivych modulu a zprostredkovava
 * prekald pro zadane klicove slovo. Pri prekladu je bran ohled na nastaveny
 * jazyk prihlaseneho uzivatele. Pokud preklad pro pozadovany jazyk neni nalezen
 * je vracen preklad pro vychozi jazyk.
 *
 * @author David Dusek
 */
namespace CMS;

class Dictionary {
    private static $instance = null;
    private $dictionary = array();
    private $lang = "cs";
    private $defLang = "cs";
    public $availableLangs = array();
    
    private function __construct() {
        $this->buildDictionary();
    }
    
    /**
     * Ziskani instance slovniku.
     * @return \CMS\Dictionary 
     */
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new Dictionary();
        }
        
        return self::$instance;
    }
    
    /**
     * Nastaveni slovniku pro preklady. Slovnik je vicedimenzionalni asociativni
     * pole ve tvaru [jazyk][modul][hledany index]
     * @param type $dictionary 
     */
    public function setDictionary($dictionary) {
        $this->dictionary = $dictionary;
    }
    
    /**
     * Nastaveni jazyka podle nastaveni uzivatele a nastaveni vychoziho jazyka
     * pro pripad ze nebude nalezen vysledek prekladu pro nastaveni uzivatele.
     * @param string $lang kod jazyka podle ISO 639-1
     * @param string $defLang kod jazyka podle ISO 639-1
     */
    public function setLangs($lang, $defLang) {
        $this->lang = $lang;
        $this->defLang = $defLang;
    }
    
    /**
     * Vrati preklad pro zadany kod a jazyk. Pokud pro dany jazyk preklad 
     * neexistuje tak vrati preklad ve vychozim jazyce.
     * @param string $code index pro prekladanou frazi napr.: user_adminMenuItem, 
     * kde predpodtrzitkem je nazev modulu
     * @return string Prazdny retezec pokud preklad neexistuje ani v pozadovanem
     * ani ve vychozim jazyce jinak preklad.
     */
    public function translate($code) {
        $traslate = "";
        
        if ($this->dictionary !== null && is_array($this->dictionary)) {
            $pos = strpos($code, '_');
            if ($pos !== FALSE) {
                $module = substr($code, 0, $pos);
                $index = substr($code, $pos+1, strlen($code));
                
                if (isset($this->dictionary[$this->lang][$module][$index])) {
                    $traslate = $this->dictionary[$this->lang][$module][$index];
                } else if (isset($this->dictionary[$this->defLang][$module][$index])) {
                    $traslate = $this->dictionary[$this->defLang][$module][$index];
                } else {
                    $traslate = "Doplňte překlad pro index '$index' do souboru " . $this->lang . ".lang v modulu " . ucfirst($module) . ".";
                }
            }
        }
        return $traslate;
    }
    
    /**
     * Vytvoreni slovniku ze souboru .lang u jednotlivych modulu.
     */
    private function buildDictionary() {
        $handle = opendir(MODULE_DIR);
        if ($handle) {
            while (false !== ($entry = readdir($handle))) {
                if ($entry != "." && $entry != ".." && is_dir(MODULE_DIR . "/$entry")) {
                    $this->loadModuleLanguages($entry);
                }
            }
        }
    }
        
    /**
     * Nacteni vsech dostupnych prekladu pro modul a jejich vlozeni do lokalniho
     * slovniku reprezentovaneho atributem dictionary.
     * @param type $module nazev modu, napr.: page
     */
    private function loadModuleLanguages($module) {
        $path = MODULE_DIR . "/$module/languages";
        
        if (!is_dir($path)) {
            return;
        }
        
        $handle = opendir(MODULE_DIR . "/$module/languages");
        while (FALSE !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != ".." && is_file($path . "/$entry")) {
                $lang = substr($entry, 0, -5);
                if (!in_array($lang, $this->availableLangs)) {
                    $this->availableLangs[$lang] = $lang;
                }                
                
                $content = file_get_contents($path . "/$entry");
                if ($content !== FALSE) {
//                    \Nette\Diagnostics\Debugger::dump(json_decode($content, true));
                    $this->dictionary[$lang][$module] = json_decode($content, true);
                }
            }
        }
    }
}
